home *** CD-ROM | disk | FTP | other *** search
/ Java Developer's Companion / Java Developer's Companion.iso / binaries / Windows / jsdk / src / sun / servlet / isapi / ISAPIConnection.cpp next >
Encoding:
C/C++ Source or Header  |  1997-07-18  |  8.7 KB  |  312 lines

  1. /*
  2.  * @(#)ISAPIConnection.cpp    1.9 97/05/11
  3.  * 
  4.  * Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * This software is the confidential and proprietary information of Sun
  7.  * Microsystems, Inc. ("Confidential Information").  You shall not
  8.  * disclose such Confidential Information and shall use it only in
  9.  * accordance with the terms of the license agreement you entered into
  10.  * with Sun.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  15.  * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
  16.  * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
  17.  * THIS SOFTWARE OR ITS DERIVATIVES.
  18.  * 
  19.  * CopyrightVersion 1.0
  20.  */
  21.  
  22.  
  23. /*
  24.  * These are the JNI native method implementation for ISAPIConnection
  25.  *
  26.  * @version    1.9, 05/11/97
  27.  * @author    Jongyoon Lee
  28.  */
  29.  
  30. #include <jni.h>
  31. #include <stdio.h>
  32. #include <HttpExt.h>
  33. #include "sun_servlet_isapi_ISAPIConnection.h"
  34.  
  35.  
  36. /*
  37.  * Helper function to retrieve ECB pointer from Java class
  38.  */
  39. EXTENSION_CONTROL_BLOCK *getECB(JNIEnv *env, jobject obj) {
  40.     
  41.     jclass cls = env->GetObjectClass(obj);
  42.  
  43.     // long ecb
  44.     jfieldID fid = env->GetFieldID(cls, "ecb", "J");
  45.     if (fid == 0) {
  46.         return NULL;
  47.     }
  48.  
  49.     // cast the long pointer
  50.     return (LPEXTENSION_CONTROL_BLOCK) env->GetLongField(obj, fid);
  51.  
  52. }
  53.  
  54. /*
  55.  * Class:     sun_servlet_isapi_ISAPIConnection
  56.  * Method:    setStatusCode
  57.  * Signature: (J)V
  58.  */
  59. JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_setStatusCode
  60. (JNIEnv *env, jobject obj, jlong status) {
  61.  
  62.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  63.     ecb->dwHttpStatusCode = (DWORD) status;
  64. }
  65.  
  66. /*
  67.  * Class:     sun_servlet_isapi_ISAPIConnection
  68.  * Method:    getMethod
  69.  * Signature: ()Ljava/lang/String;
  70.  */
  71. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getMethod
  72. (JNIEnv *env, jobject obj) {
  73.  
  74.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  75.     return env->NewStringUTF(ecb->lpszMethod);
  76. }
  77.  
  78. /*
  79.  * Class:     sun_servlet_isapi_ISAPIConnection
  80.  * Method:    getQueryString
  81.  * Signature: ()Ljava/lang/String;
  82.  */
  83. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getQueryString
  84. (JNIEnv *env, jobject obj) {
  85.  
  86.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  87.     return env->NewStringUTF(ecb->lpszQueryString);
  88. }
  89.  
  90. /*
  91.  * Class:     sun_servlet_isapi_ISAPIConnection
  92.  * Method:    getPathInfo
  93.  * Signature: ()Ljava/lang/String;
  94.  */
  95. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getPathInfo
  96. (JNIEnv *env, jobject obj) {
  97.  
  98.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  99.     return env->NewStringUTF(ecb->lpszPathInfo);
  100.                  
  101. }
  102.  
  103. /*
  104.  * Class:     sun_servlet_isapi_ISAPIConnection
  105.  * Method:    getPathTranslated
  106.  * Signature: ()Ljava/lang/String;
  107.  */
  108. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getPathTranslated
  109. (JNIEnv *env, jobject obj) {
  110.  
  111.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  112.     return env->NewStringUTF(ecb->lpszPathTranslated);
  113. }
  114.  
  115. /*
  116.  * Class:     sun_servlet_isapi_ISAPIConnection
  117.  * Method:    getContentType
  118.  * Signature: ()Ljava/lang/String;
  119.  */
  120. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getContentType
  121. (JNIEnv *env, jobject obj) {
  122.  
  123.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  124.     return env->NewStringUTF(ecb->lpszContentType);
  125. }
  126.  
  127. /*
  128.  * Class:     sun_servlet_isapi_ISAPIConnection
  129.  * Method:    getRealPath
  130.  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  131.  */
  132. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getRealPath
  133. (JNIEnv *env, jobject obj, jstring vpath) {
  134.  
  135.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  136.     char buf[256];
  137.     unsigned long len = 256;
  138.     const char *keybuf = env->GetStringUTFChars(vpath, 0);
  139.     memset(buf, 0, 256);
  140.     strcpy(buf, keybuf);
  141.  
  142.     // release the UTF buffer
  143.     env->ReleaseStringUTFChars(vpath, keybuf);
  144.  
  145.     // get the real path
  146.     ecb->ServerSupportFunction(ecb->ConnID,
  147.                    HSE_REQ_MAP_URL_TO_PATH,
  148.                    buf,
  149.                    &len,
  150.                    &len);
  151.  
  152.     return env->NewStringUTF(buf);
  153. }
  154.  
  155. /*
  156.  * Class:     sun_servlet_isapi_ISAPIConnection
  157.  * Method:    getServerVariable
  158.  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  159.  */
  160. JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getServerVariable
  161. (JNIEnv *env, jobject obj, jstring key) {
  162.  
  163.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  164.     char valbuf[256];
  165.     unsigned long len = 256;
  166.     const char *keybuf = env->GetStringUTFChars(key, 0);
  167.     memset(valbuf, 0, 256);
  168.  
  169.     // get the variable
  170.     ecb->GetServerVariable(ecb->ConnID, (char *)keybuf, valbuf, &len);
  171.  
  172.     // release the UTF buffer
  173.     env->ReleaseStringUTFChars(key, keybuf);
  174.     return env->NewStringUTF(valbuf);
  175. }
  176.  
  177. /*
  178.  * Class:     sun_servlet_isapi_ISAPIConnection
  179.  * Method:    sendRedirect
  180.  * Signature: (Ljava/lang/String;)V
  181.  */
  182. JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_sendRedirect
  183. (JNIEnv *env, jobject obj, jstring url) {
  184.  
  185.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  186.     const char *urlbuf = env->GetStringUTFChars(url, 0);
  187.     unsigned long len = strlen(urlbuf);
  188.  
  189.     // send the redirect
  190.     ecb->ServerSupportFunction(ecb->ConnID,
  191.                    HSE_REQ_SEND_URL,
  192.                    (LPVOID)urlbuf,
  193.                    &len,
  194.                    &len);
  195.  
  196.     // release the UTF buffer
  197.     env->ReleaseStringUTFChars(url, urlbuf);
  198. }
  199.  
  200. /*
  201.  * Class:     sun_servlet_isapi_ISAPIConnection
  202.  * Method:    getData
  203.  * Signature: (J[BJJ)J
  204.  */
  205. JNIEXPORT jlong JNICALL Java_sun_servlet_isapi_ISAPIConnection_getData
  206. (JNIEnv *env, jobject obj, jlong start, jbyteArray buf, jlong off, jlong blen) {
  207.  
  208.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  209.     unsigned long len = ((unsigned long) blen < ecb->cbAvailable) ?
  210.       (unsigned long)blen : ecb->cbAvailable;
  211.     env->SetByteArrayRegion(buf, (long) off, len,
  212.                 (jbyte *)(ecb->lpbData + start));
  213.     return len;
  214. }
  215.  
  216. /*
  217.  * Class:     sun_servlet_isapi_ISAPIConnection
  218.  * Method:    writeHeaders
  219.  * Signature: ([BJJ)V
  220.  */
  221. JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_writeHeaders
  222. (JNIEnv *env, jobject obj, jbyteArray status, jlong soff, jlong slen,
  223.                            jbyteArray headers, jlong hoff, jlong hlen) {
  224.  
  225.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  226.     byte *statbuf = NULL, *headerbuf = NULL;
  227.     unsigned long len = (unsigned long) hlen;
  228.  
  229.     if (slen != 0) {
  230.         statbuf = (byte *) malloc((unsigned int) slen + 10);
  231.         memset(statbuf, 0, (int) slen + 10);
  232.     env->GetByteArrayRegion(status,
  233.                 (long) soff,
  234.                 (long) slen,
  235.                 (jbyte *) statbuf);
  236.     }
  237.     if (hlen != 0) {
  238.         headerbuf = (byte *) malloc((unsigned int) hlen + 10);
  239.         memset(headerbuf, 0, (int) hlen + 10);
  240.     env->GetByteArrayRegion(headers,
  241.                 (long) hoff,
  242.                 (long) hlen,
  243.                 (jbyte *) headerbuf);
  244.     }
  245.     ecb->ServerSupportFunction(ecb->ConnID,
  246.                    HSE_REQ_SEND_RESPONSE_HEADER,
  247.                    statbuf,
  248.                    &len,
  249.                    (LPDWORD) headerbuf);
  250.  
  251.     if (statbuf != NULL) {
  252.         free(statbuf);
  253.     }
  254.     if (headerbuf != NULL) {
  255.         free(headerbuf);
  256.     }
  257. }
  258.  
  259. /*
  260.  * Class:     sun_servlet_isapi_ISAPIConnection
  261.  * Method:    readClient
  262.  * Signature: ([BJJ)J
  263.  */
  264. JNIEXPORT jlong JNICALL Java_sun_servlet_isapi_ISAPIConnection_readClient
  265. (JNIEnv *env, jobject obj, jbyteArray b, jlong off, jlong len) {
  266.  
  267.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  268.     byte *buf = (byte *) malloc((unsigned int) len + 10);
  269.     //memset(buf, 0, (int) len + 10);
  270.     unsigned long retlen = (unsigned long) len;
  271.     ecb->ReadClient(ecb->ConnID, buf, &retlen);
  272.     env->SetByteArrayRegion(b, (long) off, retlen, (jbyte *)buf);
  273.  
  274.     free(buf);
  275.     return retlen;
  276. }
  277.  
  278. /*
  279.  * Class:     sun_servlet_isapi_ISAPIConnection
  280.  * Method:    writeClient
  281.  * Signature: ([BJJ)V
  282.  */
  283. JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_writeClient
  284. (JNIEnv *env, jobject obj, jbyteArray b, jlong off, jlong len) {
  285.  
  286.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  287.     byte *buf = (byte *) malloc((unsigned int) len + 10);
  288.     memset(buf, 0, (int) len + 10);
  289.     unsigned long retlen = (unsigned long) len;
  290.     env->GetByteArrayRegion(b, (long) off, (long) len, (jbyte *)buf);
  291.     ecb->WriteClient(ecb->ConnID, buf, &retlen, HSE_IO_SYNC);
  292.     // check if retlen is really len, and wrote everything out
  293.  
  294.     free(buf);
  295. }
  296.  
  297. /*
  298.  * Class:     sun_servlet_isapi_ISAPIConnection
  299.  * Method:    finish
  300.  * Signature: ()V
  301.  */
  302. JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_finish
  303. (JNIEnv *env, jobject obj) {
  304.  
  305.     EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
  306.     ecb->ServerSupportFunction(ecb->ConnID,
  307.                    HSE_REQ_DONE_WITH_SESSION,
  308.                    (LPVOID) NULL,
  309.                    (LPDWORD) NULL,
  310.                    (LPDWORD) NULL);
  311. }
  312.